昨天我們提到利用list能將所有不同類型的資料儲存起來所以list裡面可以放任何東西,資料的型態可以很多元。
雖然list能儲存多元的資料,但相較matrix矩陣資料還是比較不太好管理,並不像矩陣有直排橫列,看起來也更優化
還記得矩陣必須要是數值,因此透過資料框data.frame()便可以達成。
換句話說,可以把data.frame當成matrix和list之間它們有很多觀念都很相似,使用的手法也幾乎雷同
一樣我們在取出之前的資料,和之前在設定list一樣,只要把前面改成data.frame就可以製作成類似矩陣的表格。
na <- c("Billy", "Bloodhoof", "Scars", "Dean", "Sammy")
ra <- c("Orc", "Hoblin", "Goblin", "Elf", "Harpy")
sa <- c(120, 88, 50, 190, 166)
we <- factor(c("OK", "POOR", "POOR", "RICH", "RICH" ), ordered = TRUE, levels = c("POOR", "OK", "RICH"))
村莊狀態 <- data.frame( "名字" = na, "種族" = ra, "儲蓄" = sa, "富有度" = we )
print(村莊狀態)
名字 種族 儲蓄 富有度
1 Billy Orc 120 OK
2 Bloodhoof Hoblin 88 POOR
3 Scars Goblin 50 POOR
4 Dean Elf 190 RICH
5 Sammy Harpy 166 RICH
假設數據比較龐大,我們可以透過tail()和head()來擷取資料
tail(村莊狀態)
head(村莊狀態)
通常會擷取資料的前六筆或後六筆
另外透過緯度dim()可以查詢比數狀態
dim(村莊狀態)
[1] 5 4
5代表共5筆,
5代表共5筆觀測值(Observations,Obs)來稱呼資料框中水平方向的資料,4代表變數(Variables)來稱呼資料框中垂直方向的資料。
資料方向 矩陣 資料框
水平 Rows Observations
垂直 Columns Variables
同樣的來看看資料的結構吧!
str(村莊狀態)
'data.frame': 5 obs. of 4 variables:
$ 名字 : Factor w/ 5 levels "Billy","Bloodhoof",..: 1 2 5 3 4
$ 種族 : Factor w/ 5 levels "Elf","Goblin",..: 5 4 2 1 3
$ 儲蓄 : num 120 88 50 190 166
$ 富有度: Ord.factor w/ 3 levels "POOR"<"OK"<"RICH": 2 1 1 3 3
注意到這邊名字及種族都被轉換成factor
當轉成data frame的時候,R會將資料自動轉換成factor,來比較一下原先的資料,
na <- c("Billy", "Bloodhoof", "Scars", "Dean", "Sammy")
str(na)
chr [1:5] "Billy" "Bloodhoof" "Scars" "Dean" "Sammy"
因此透過stringsAsFactors = FALSE的指令我們可以告訴R不要將資料轉成factor
當然如果我們要將種族保留成factor,名字改成charactor也是可以的
首先先將ra設定成factor在帶入指令
ra_factor <- as.factor(ra)
村莊狀態 <- data.frame( "名字" = na, "種族" = ra_factor, "儲蓄" = sa, "富有度" = we, stringsAsFactors = FALSE)
村莊狀態
'data.frame': 5 obs. of 4 variables:
$ 名字 : chr "Billy" "Bloodhoof" "Scars" "Dean" ...
$ 種族 : Factor w/ 5 levels "Elf","Goblin",..: 5 4 2 1 3
$ 儲蓄 : num 120 88 50 190 166
$ 富有度: Ord.factor w/ 3 levels "POOR"<"OK"<"RICH": 2 1 1 3 3
這邊可以看到名字已改回字元chr,種族的部分還是保留為因子。